# 使用官方的 Python 运行时作为基础镜像
# 推荐使用特定版本的 Python 镜像，例如 python:3.11-slim
# `slim` 版本更小，只包含运行 Python 应用所需的最基本包
FROM python:3.11-slim

# 创建一个非root用户来提高安全性
RUN useradd -m appuser

# 设置工作目录
WORKDIR /app


RUN mkdir -p "/app/data" && \
    chown -R appuser:appuser /app

# 设置环境变量 (可选)
# 这有助于在容器内设置环境，例如指定 Python 不要生成 .pyc 文件的缓存
ENV PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1

ENV PATH=$PATH:/home/appuser/.local/bin

# 切换到非root用户
USER appuser

# 将 requirements.txt 复制到容器中
# 将 requirements.txt 单独复制并安装依赖，可以利用 Docker 的层缓存机制
# 只有当 requirements.txt 文件发生变化时，才会重新安装依赖，加快后续构建速度
COPY requirements.txt .

# 安装 Python 依赖
# 使用 -r 标志安装 requirements.txt 中列出的所有包
# 使用清华镜像源（可以根据需要修改镜像源）
RUN pip install --no-cache-dir --upgrade pip -i https://mirrors.ustc.edu.cn/pypi/simple && \
    pip install --no-cache-dir -r requirements.txt -i https://mirrors.ustc.edu.cn/pypi/simple && \
    rm -rf ~/.cache

# 将应用代码复制到容器中
# 将代码复制放在依赖安装之后，这样代码的更改不会导致依赖重新安装
COPY . .

# 暴露端口
# 告诉 Docker 容器在运行时监听指定的端口
EXPOSE 8000

# 定义运行容器时执行的命令
# 使用 uvicorn 作为 ASGI 服务器来运行 FastAPI 应用
# --host 0.0.0.0 允许容器外部访问
# --port 8000 指定端口
# 如果你的主文件名或应用实例名不同，请相应修改
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "4"]
